home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / utils1.arj / TESTDSK.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-05-14  |  8.8 KB  |  416 lines

  1. ;              PC y COMPATIBLES
  2. ; ****************************************
  3. ; ***  TESTDSK.COM  v 1.1 / JCE 1992   ***
  4. ; ****************************************
  5. ;                MAYO  1992
  6. ; Localiza 1er sector defecuoso,para PROT2
  7. ;
  8. ;
  9.  
  10. CSEG            SEGMENT PUBLIC
  11.                 ASSUME CS:CSEG, DS:CSEG, SS:CSEG
  12.  
  13.         ORG     100h
  14.  
  15. TESTDSK_COM:
  16.  
  17.         JMP     RUN00
  18.  
  19. ;
  20. sect            DB 0,0
  21. drive_num       DB 0
  22. ;
  23.  
  24. RUN00:
  25.         XOR     AX,AX                   ; por defecto sel. drive A
  26.         MOV     BYTE PTR [drive_num],AL
  27.  
  28.     CALL    cls
  29.  
  30.         MOV     DX,OFFSET MSG0
  31.     CALL    printc
  32.  
  33.         MOV     DX,OFFSET MSG01
  34.     CALL    printc
  35. sel_drive:
  36.         MOV     AH,12
  37.         MOV     AL,8
  38.         INT     21H                     ; Lee teclado borrando buffer
  39.  
  40.     CMP    AL,"A"
  41.     JE    run0
  42.     CMP    AL,"a"
  43.         JE      run0
  44.         CMP     AL,"B"
  45.         JE      drive_B
  46.         CMP     AL,"b"
  47.     JNE    sel_drive
  48. drive_B:
  49.         INC     BYTE PTR [drive_num]    ; selecciona unidad B
  50. run0:
  51.         MOV     DX,OFFSET MSG02
  52.     CALL    printc
  53.         MOV     AL,BYTE PTR [drive_num]
  54.     ADD    AL,65
  55.     MOV    DL,AL
  56.     MOV    AH,2
  57.         INT     21H                     ; Escribe A o B sumando 65 a 1 o 0
  58.  
  59. run:
  60.         MOV     DX,OFFSET MSG1
  61.         CALL    printc
  62.         CALL    RETURN
  63.  
  64.         CALL    ANALIZA                 ; Analiza unidad
  65.  
  66.         MOV     DX,OFFSET MSG2
  67.         CALL    printc
  68.  
  69.         MOV     DX,1                    ; primer sector a leer
  70.         MOV     BX,OFFSET buffer2       ; dir transferencia en RAM
  71.         MOV     CX,3200                 ; num. sectores a leer
  72.  
  73. bucle1:
  74.         PUSH    DX
  75.     PUSH    DX
  76.     MOV    DL,DH
  77.     CALL    write_hex
  78.         POP     DX
  79.     CALL    write_hex
  80.         POP     DX
  81.  
  82.         PUSH    CX
  83.     MOV    CX,1
  84.  
  85.         MOV     WORD PTR [sect],DX
  86.  
  87.         CALL    REDISK
  88.         MOV     AL,BYTE PTR [drive_num]
  89.         INT     26h
  90.         POP     DI
  91.         CMP     AL,8                    ; si el sect no existe ...
  92.         JE     bucle2                   ; no puede ser el sect buscado!
  93.  
  94.         CALL    REDISK
  95.         MOV     AL,BYTE PTR [drive_num]
  96.         INT     25h                     ; lee sectores de disco
  97.         POP     DI                      ; elimina pila
  98.         JC      error
  99.  
  100. bucle2:
  101.         PUSH    DX
  102.         MOV     DX,OFFSET MSG4
  103.     CALL    printc
  104.         POP     DX
  105.  
  106.  
  107.         POP     CX
  108.         INC     DX
  109.     LOOP    bucle1
  110.  
  111. ; terminado test sin encontrar ningun sector defectuoso
  112.  
  113.         MOV     DX,OFFSET MSG10
  114.         CALL    printc
  115.         CALL    RETURN
  116.         JMP     start
  117.  
  118. ;
  119. retest:
  120.         MOV     DX,OFFSET MSG6
  121.     CALL    printc
  122. retest2:
  123.         MOV     AH,12
  124.         MOV     AL,8
  125.         INT     21H                             ; Lee teclado borrando buf
  126.  
  127.         CMP     AL,"E"
  128.         JE      escribe_cod
  129.         CMP     AL,"e"
  130.         JE      escribe_cod
  131.         CMP     AL,"S"
  132.     JE    start
  133.         CMP     AL,"s"
  134.     JE    start
  135.         CMP     AL,"N"
  136.     JE    retdos
  137.         CMP     AL,"n"
  138.         JNE     retest2
  139.  
  140. retdos:
  141.         CALL    cls
  142.         MOV     DX,OFFSET MSG3
  143.     CALL    printc
  144.         INT     20h                             ; Sale al DOS
  145.  
  146. error:  JMP     error2
  147. ;
  148.  
  149. start:
  150.     CALL    cls
  151.         MOV     DX,OFFSET MSG0
  152.     CALL    printc
  153.         JMP     run0
  154.  
  155.  
  156. ;
  157. ;  escribe en el sector anterior al defectuoso
  158. ; un codigo que despues sera leido por PROTEST.COM
  159. ;
  160.  
  161. escribe_cod:
  162.  
  163.     CLC
  164.     MOV    BX,0
  165.         MOV     DX,WORD PTR BUFFER1[BX]         ; recupera num sector
  166.     DEC    DX                ; num sect-1
  167.         MOV     CX,1                            ; num de sectores
  168.         MOV     BX,OFFSET CODIGO                ; datos a escribir
  169.  
  170.         CALL    REDISK
  171.         CLC
  172.         MOV     AL,BYTE PTR [drive_num]
  173.         INT     26H                             ; escribe en disco
  174.         POP     DI                              ; Limpia STACK
  175.         JC      disco_proteg
  176.         MOV     DX,OFFSET MSG8
  177.     CALL    printc
  178.         JMP     retest
  179.  
  180. disco_proteg:
  181.  
  182.         MOV     DX,OFFSET MSG7
  183.     CALL    printc
  184.         CALL    RETURN
  185.     JMP    escribe_cod
  186.  
  187.  
  188.  
  189. ;
  190. ; OK.  localizado primer sector con defecto
  191. ;
  192. error2:
  193.         MOV     BX,OFFSET BUFFER1
  194.         MOV     WORD PTR DS:[BX],DX
  195.         MOV     DX,OFFSET MSG5
  196.     CALL    printc
  197.     JMP    retest    ; vuelve a opciones
  198.  
  199. ;
  200. ; Analiza posibles errores en el drive
  201. ;
  202.  
  203. ANALIZA:
  204.         MOV     CX,1
  205.         MOV     DX,0
  206.         MOV     BX,OFFSET buffer2
  207.  
  208.         CALL    REDISK
  209.         CLC
  210.         MOV     AL,BYTE PTR [drive_num]
  211.         INT     25h                             ;  Lee sect 0
  212.         POP     DI
  213.  
  214.         JNC     ANALIZA2
  215.  
  216.         CMP     AL,07
  217.         JE      no_formato
  218.  
  219.         CMP     AL,02
  220.         JE      no_disk
  221.  
  222.         JMP      pista_0_error
  223.  
  224. ANALIZA2:
  225.         CALL    REDISK
  226.         CLC
  227.         MOV     AL,BYTE PTR [drive_num]
  228.         INT     26h                             ; Reescribe sect 0
  229.         POP     DI
  230.  
  231.         JC      disco_protegido
  232.         RET
  233.  
  234. ;
  235. ; Errores de disco
  236. ;
  237. no_formato:
  238.         MOV     DX,OFFSET MSG51
  239.         CALL    printc
  240.         JMP     RUN
  241.  
  242. no_disk:
  243.         MOV     DX,OFFSET MSG52
  244.         CALL    printc
  245.         JMP     RUN
  246.  
  247. pista_0_error:
  248.         MOV     DX,OFFSET MSG53
  249.         CALL    printc
  250.         JMP     RUN
  251.  
  252. disco_protegido:
  253.         MOV     DX,OFFSET MSG54
  254.         CALL    printc
  255.         JMP     RUN
  256.  
  257. ; ==============================
  258. ; Reinicializa sistema diskettes
  259. ; ==============================
  260.  
  261. redisk:
  262.         PUSH    AX
  263.         PUSH    DX
  264.         MOV     DL,BYTE PTR [drive_num]          ; ?????
  265.         XOR     AX,AX
  266.         INT     13H
  267.         POP     DX
  268.         POP     AX
  269.         RET
  270.  
  271. ; =========================================
  272. ; DS:DX, dir del MSG a imprimir en pantalla
  273. ; =========================================
  274.  
  275. printc:
  276.         PUSH    AX
  277.     MOV    AH,9
  278.     INT    21H
  279.         POP     AX
  280.     RET
  281.  
  282. ; ====================================
  283. ; Espera a que se pulse ENTER y vuelve
  284. ; ====================================
  285.  
  286. RETURN:
  287.         PUSH    AX
  288. RETURN2:
  289.     MOV    AH,8
  290.     INT    21H
  291.     CMP    AL,13
  292.         JNE     RETURN2
  293.         POP     AX
  294.     RET
  295.  
  296. ; =================
  297. ; borra la pantalla
  298. ; =================
  299.  
  300. cls:
  301.     MOV    AL,0
  302.     MOV    CX,0
  303.     MOV    DH,24
  304.     MOV    DL,79
  305.         MOV     BH,7                    ; atributo
  306.     MOV    AH,6
  307.         INT     10H                     ; borra
  308.     MOV    DX,0
  309.     MOV    BH,0
  310.     MOV    AH,2
  311.         INT     10H                     ; locate 0,0
  312.         RET
  313.  
  314.  
  315.  
  316. ; ==========================================
  317. ; DL ... Byte a convertir en HEX  (P.Norton)
  318. ; ==========================================
  319.  
  320. write_hex    proc near
  321.     push    cx
  322.     push    dx
  323.     mov    dh,dl
  324.     mov    cx,4
  325.     shr    dl,cl
  326.     call    write_hex_digit
  327.     mov    dl,dh
  328.     and    dl,0fh
  329.     call    write_hex_digit
  330.     pop    dx
  331.     pop    cx
  332.     ret
  333. write_hex    endp
  334.  
  335.  
  336. write_hex_digit proc near
  337.     push    dx
  338.     cmp    dl,10
  339.     jae    hex_letter
  340.     add    dl,"0"
  341.     jmp    short write_digit
  342. hex_letter:
  343.     add    dl,"A"-10
  344. write_digit:
  345.     call    write_char
  346.     pop    dx
  347.     ret
  348. write_hex_digit endp
  349.  
  350. ;
  351. write_char    proc near
  352.     push    ax
  353.     mov    ah,2
  354.     int    21h
  355.     pop    ax
  356.     ret
  357. write_char    endp
  358.  
  359.  
  360. ;  ---------------------
  361. ;  --- ZONA DE DATOS ---
  362. ;  ---------------------
  363.  
  364. MSG0:   db      10,13,"  **********************"
  365.         db      10,13," *** TESTDSK.COM v1.1 ***"
  366.         db      10,13,"  **********************"
  367.         db      10,13,"   Juan C. Enrique 1992$"
  368.  
  369. MSG01:    db    10,13,10,13,"Selecciona drive (A,B) ?$"
  370. MSG02:    db    10,13,10,13,"* OK. La unidad de disco activa es :$"
  371. MSG1:   db      10,13,10,13,"<<< ATENCION: EL DISCO-LLAVE SERA BORRADO >>>"
  372.         db      10,13,10,13,"Introduzca el disco a testear desprotegido "
  373.         db      10,13,"y pulse 'ENTER' para comenzar el test ..."
  374.         db      10,13,10,13,"$"
  375.  
  376. MSG2:   db      "Testeando sector ...$"
  377. MSG3:   db      10,13,10,13,"* TESTDSK terminado!$"
  378.  
  379. MSG4:    db    8,8,8,8,"$$$"
  380.  
  381. MSG5:    db    7,7,7,10,13,"Localizado primer sector defectuoso !$"
  382.  
  383. MSG6:   db  10,13,10,13,10,13
  384.     db    " Pulse 'E' para escribir codigo ref.",10,13
  385.         db      "       'S' para testear otro diskette",10,13
  386.         db      "       'N' para salir al DOS",10,13,"$"
  387.  
  388. MSG7:    db 7,10,13," Desproteja el diskette y pulse ENTER ...$"
  389. MSG8:   db 10,13," Ok, codigo grabado$"
  390.  
  391. MSG10:  db 7,10,13,"Test terminado. NO HAY SECTOR DEFECTUOSO !!!"
  392.         db 10,13,  "(Pulse ENTER) ...$"
  393.  
  394. MSG51:  DB 7,10,13,"* Disco de formato NO STANDARD!$"
  395. MSG52:  DB 7,10,13,"* No hay disco en la unidad seleccionada!$"
  396. MSG53:  DB 7,10,13,"* Disco con PISTA-0 defectuosa!$"
  397. MSG54:  DB 7,10,13,"* Disco protegido contra escritura!$"
  398.  
  399. ;
  400. ; datos a escribir en sector def-1
  401. ;
  402.  
  403. CODIGO: DB  "JCE-06091972VIRGO$"
  404.         DB  "      Sistema de proteccion de software por "
  405.         DB  "marca fisica.  AUTOR: Juan C.Enrique / 1992 "
  406. ;
  407. ; buffers de uso interno
  408. ;
  409.  
  410. buffer1          DB 0,0
  411. buffer2          DB 0
  412.  
  413.  
  414. CSEG            ENDS
  415.                 END     TESTDSK_COM
  416.